package top.csmcool.musicapi.util;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class GlobalCache {

    // 使用 ConcurrentHashMap 来存储缓存数据，保证线程安全
    private static final Map<String, CacheItem> cacheMap = new ConcurrentHashMap<>();
    
    // 缓存项过期时间，单位为毫秒
    private static final long DEFAULT_EXPIRY_TIME = 60000; // 60秒过期

    // 存储缓存项的结构，包含值和过期时间
    public static class CacheItem {
        private Object value;
        private long expiryTime;

        public CacheItem(Object value, long expiryTime) {
            this.value = value;
            this.expiryTime = expiryTime;
        }

        public Object getValue() {
            return value;
        }

        public long getExpiryTime() {
            return expiryTime;
        }
    }

    // 添加数据到缓存
    public static void put(String key, Object value) {
        put(key, value, DEFAULT_EXPIRY_TIME);
    }

    // 添加数据到缓存，带自定义过期时间
    public static void put(String key, Object value, long expiryTime) {
        long expiryTimestamp = System.currentTimeMillis() + expiryTime;
        CacheItem cacheItem = new CacheItem(value, expiryTimestamp);
        cacheMap.put(key, cacheItem);
    }

    // 获取缓存数据
    public static Object get(String key) {
        CacheItem cacheItem = cacheMap.get(key);
        if (cacheItem == null || isExpired(cacheItem)) {
            cacheMap.remove(key); // 删除过期项
            return null; // 缓存已过期或不存在
        }
        return cacheItem.getValue();
    }

    // 检查缓存项是否过期
    private static boolean isExpired(CacheItem cacheItem) {
        return System.currentTimeMillis() > cacheItem.getExpiryTime();
    }

    // 移除缓存项
    public static void remove(String key) {
        cacheMap.remove(key);
    }

    // 清空缓存
    public static void clear() {
        cacheMap.clear();
    }

    // 打印缓存内容
    public static void printCache() {
        System.out.println(cacheMap);
    }

    // 测试代码
    public static void main(String[] args) throws InterruptedException {
        // 添加数据到缓存
        GlobalCache.put("key1", "value1");
        GlobalCache.put("key2", "value2", 2000); // 2秒后过期

        // 打印缓存内容
        System.out.println("Before expiration:");
        GlobalCache.printCache();

        // 等待3秒，key2应已过期
        Thread.sleep(3000);

        System.out.println("After 3 seconds:");
        GlobalCache.printCache(); // key2应已被移除
    }
}
